package me.yushuai.wukong.base.service;

import me.yushuai.wukong.base.api.dto.CreateLocGroupDTO;
import me.yushuai.wukong.base.api.dto.LocGroupDTO;
import me.yushuai.wukong.base.api.dto.UpdateLocGroupDTO;
import me.yushuai.wukong.base.entity.LocGroup;
import me.yushuai.wukong.common.api.AbstractPageable;
import me.yushuai.wukong.common.dto.PageDTO;
import me.yushuai.wukong.common.error.WuKongException;
import me.yushuai.wukong.common.service.BaseService;
import org.springframework.data.jpa.domain.Specification;

/**
 * 库位组业务接口
 *
 * @author zhoushuai@189.cn
 * @since 2022-08-31
 */
public interface LocGroupService extends BaseService {

    /**
     * 新建一条库位组
     *
     * @param createLocGroupDTO 库位组信息
     * @return 返回库位组编号
     * @throws WuKongException 当库位组已存在时抛出异常
     */
    Long createLocGroup(CreateLocGroupDTO createLocGroupDTO) throws WuKongException;

    /**
     * 修改库位组信息
     *
     * @param updateLocGroupDTO 库位组信息
     * @return 返回修改后的库位组编号
     * @throws WuKongException 当库位组不存在时抛出异常
     */
    Long updateLocGroup(UpdateLocGroupDTO updateLocGroupDTO) throws WuKongException;

    /**
     * 删除一条库位组信息
     *
     * @param locGroupId 库位组编号
     * @throws WuKongException 当库位组编号不存在时抛出异常
     */
    void deleteLocGroup(Long locGroupId, Long version) throws WuKongException;

    /**
     * 通过库位编号查询库位组的详细信息
     *
     * @param locGroupId 库位组编号
     * @return 返回库位组的详细信息
     * @throws WuKongException 当库位组不存在时抛出异常
     */
    LocGroupDTO findOne(Long locGroupId) throws WuKongException;

    /**
     * 分页条件检索库位组信息
     *
     * @param spec     查询条件
     * @param pageable 分页条件
     * @return 分页返回查询结果
     */
    PageDTO<LocGroupDTO> pagingSearchLocGroup(AbstractPageable pageable, Specification<LocGroup> spec);


    /**
     * 断言库位组编号已存在
     *
     * @param locGroupId 库位组编号
     * @throws WuKongException 当库位组编号不存在时抛出异常
     */
    void assertLocGroupIdExist(Long locGroupId) throws WuKongException;

    /**
     * 断言库位组编号与库存组编码一致, 库位编号与库位编码不一致时抛出异常
     *
     * @param locGroupId   库位组编号
     * @param locGroupCode 库位组编码
     * @throws WuKongException 当库位组编号与库位组编码不一致时抛出异常
     */
    void assertLocGroupIdAndLocGroupCodeMatch(Long locGroupId, String locGroupCode) throws WuKongException;


    /**
     * 断言库位组编码不存在，当库位编码已存在时抛出异常
     *
     * @param locGroupCode 库位组编码
     * @throws WuKongException 当库位组编码已存在时抛出异常
     */
    void assertLocGroupCodeNotExist(String locGroupCode) throws WuKongException;
}
